#include <stdio.h>
#include <errno.h>
#include <string.h>

/*
*二进制读取
size_t fread(void *ptr, size_t size ,size_t nmemb, FILE *stream);
功能:
    从文件流中读取'nmemb'个数据块， 每个数据块的大小为'size'字节，并存储到'ptr'指向的内存中
参数：
    @ptr:指向存储读取数据的内存地址
    @size：每个数据块的大小(以字节)
    @numemb: 要读取的数据块的数量
    @stream：文件指针
返回值：
    成功 返回实际读取到的数据块的数量
    失败或到达文件末尾位置 返回值小于‘nmemb’


*二进制写入
#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t nememb,FILE *stream);
功能：
    将'ptr'指向的内存数据写入文件流，总共写入‘nememb’个数据块，每个数据块的大小为‘size’字节
参数：
    @ptr:只想要写入的数据的内存地址
    @size：每个数据块的大小(以字节为单位)
    @numemb:要写入的数据块的数量
    @stream：文件指针
返回值：
    成功 返回写入的实际数据块的值
    失败 返回值小于‘nememb’
*/

typedef struct str
{
    char name[128];
    int id;
    char ch;
}str;

#define FOPEN_ERR(FP) if (NULL == FP)\
    {\
    perror("fopen error:");\
    return 0;\
    }\

str s_srr[5] = {
    {"张1", 1 , '\n'},
    {"张2", 2 , '\n'},
    {"张3", 3 , '\n'},
    {"张4", 4 , '\n'},
    {"张5", 5 , '\n'}
};

str s_srr_1[5] = {};

int main(int argc,const char *argv[])
{
    //清空s_srr_1数组中的数据
    memset(s_srr_1, 0 , sizeof(s_srr_1));//清空结构体

    //打开文件“张三.txt”以进行读写
    FILE *fp = fopen("张三.txt","w+");
    FOPEN_ERR(fp);

    //将s_srr数组中的数据写入文件
    fseek(fp,0,SEEK_SET);
    fwrite(s_srr,sizeof(str),sizeof(s_srr)/sizeof(str),fp);

    //将s_srr数组中的数据读取到s_srr_1数组中
    fseek(fp,0,SEEK_SET);//从头开始
    fread(s_srr_1,sizeof(str),sizeof(s_srr)/sizeof(str),fp);

    for(size_t i=0;i<5;i++)
    {
        printf("%s%d%c\n",s_srr_1[i].name,s_srr_1[i].id,s_srr_1[i].ch);
    }
    fclose(fp);
    return 0;
}